from typing import List, TypeVar, Generic

from pydantic import BaseModel, field_validator


class PaginationParams(BaseModel):
    currentPage: int = 1  # 当前页码，从 1 开始
    pageSize: int = 10    # 每页数据量

    class Config:
        validate_assignment = True

    @field_validator("pageSize")
    def limit_page_size(cls, v):
        if v > 100:
            raise ValueError("pageSize 最大为 100")
        return v


T = TypeVar("T")


class PageResult(BaseModel, Generic[T]):
    """通用分页结果模型"""
    current: int = 1  # 当前页码（从 1 开始）
    size: int = 10  # 每页大小
    total: int = 0  # 总记录数
    pages: int = 0  # 总页数
    records: List[T] = []     # 数据列表

    @field_validator("size")
    def validate_page_size(cls, v):
        if v < 1:
            raise ValueError("page_size 必须至少为 1")
        if v > 1000:
            raise ValueError("page_size 最大为 1000")
        return v

    @property
    def offset(self) -> int:
        """计算偏移量"""
        return (self.page - 1) * self.size